package solution;


/*
*
* 11 Array
* */
public class MaxArea {
    /*
    * 暴力解 使用双for
    * 超时了
    * */
    public static int solution1(int[] height){
//        int max = 0;
//        for (int i = 0 ; i < height.length ; i++){
//            for (int j = 0 ; j < height.length ; j++){
//                int result = Math.abs(i - j) * Math.min(height[i], height[j]);
//                if (result > max){
//                    max = result;
//                }
//            }
//        }
//        return max;


        //保证代码健壮
//        int max = 0;
//        if (height != null && height.length != 0){
//            for (int i = 0 ; i < height.length ; i++){
//                for (int j = i + 1 ; j < height.length ; j++){
//                    int area = Math.abs(i - j) * Math.min(height[i], height[j]);
//                    if (area > max){
//                        max = area;
//                    }
//                }
//            }
//        }
//        return max;

        //减少一次循环
        int max = 0;
        if (height != null && height.length > 0){
            for (int i = 0 ; i < height.length - 1 ; i++){
                for (int j = i + 1 ; j < height.length ; j++){
                    int area = Math.abs(i - j) * Math.min(height[i], height[j]);
                    if (area > max){
                        max = area;
                    }
                }
            }
        }

        return max;
    }


    /*
    * 双指针法，指向边界
    * 注意：指针A的值和指针B的值如果处理
    * 注意：循环的停止条件
    * 使用solution3的答案
    *
    *
    * */
    public static int solution2(int[] height){
//        int max = 0;
//        int pointA = 0;
//        int pointB = height.length - 1;
//        do{
//            int result = Math.abs(pointA - pointB) * Math.min(height[pointA], height[pointB]);
//            if (result > max){
//                max = result;
//            }
//            if (height[pointA] > height[pointB]){
//                pointB--;
//            }else if (height[pointA] < height[pointB]){
//                pointA++;
//            }else if (height[pointA] == height[pointB]){
//                pointA++;
//            }
//        }while (pointA <= pointB);
//        return max;
    }

    /*
    * 第二种双指针
    * 比solution2少一点时间,但是流程不太对
    * */
    public static int sulution3(int[] height){
//        int max = 0;
//        if (height == null && height.length < 2){
//            return max;
//        }
//
//        int i = 0;
//        int j = height.length - 1;
//        while (i <= j){
//            int area = Math.abs(i - j) * Math.min(height[i], height[j]);
//            if (area > max){
//                max = area;
//            }else {
//                if (height[i] >= height[j]){
//                    j--;
//                }else {
//                    i++;
//                }
//            }
//        }
//
//        return max;

        //优化代码写法
//        int max = 0;
//
//        if (height != null && height.length != 0) {
//            int i = 0;
//            int j = height.length - 1;
//
//            while (i < j) {
//                int area = Math.abs(i - j) * Math.min(height[i], height[j]);
//
//                if (area > max) {
//                    max = area;
//                } else {
//                    if (height[i] >= height[j]) {
//                        j--;
//                    } else {
//                        i++;
//
//                    }
//
//                }
//            }
//        }
//
//        return max;

        //少循环
        int max = 0;
        if (height != null && height.length > 1){
            int i = 0;
            int j = height.length - 1;
            while (j > i){
                int area = (j - i) * Math.min(height[i], height[j]);
                if (area > max){
                    max = area;
                }

                if (height[i] >= height[j]){
                    j--;
                }else {
                    i++;
                }
            }
        }
        return max;
    }
}
